home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asm_msc1.arc / ANS52.ASM < prev    next >
Assembly Source File  |  1988-11-20  |  3KB  |  83 lines

  1. TITLE  Replace an Element in an Ordered List (ANS52.ASM)
  2.           PAGE      ,132
  3. DATA      SEGMENT   PARA 'DATA'
  4. START_ADDR  DW      ?
  5. DATA      ENDS
  6. OUR_CODE  SEGMENT   PARA 'CODE'
  7.       PUBLIC    REPLACE
  8. REPLACE   PROC      FAR
  9.       ASSUME    CS:OUR_CODE,DS:DATA
  10.       CALL      B_SEARCH         ;Is the search value in the list?
  11.           JC        QUIT         ; If not, exit
  12.           MOV       ES:[SI],BX       ; If so, replace it with BX
  13. QUIT:     RET
  14. ;
  15. ;  This is B_SEARCH from Exercise 5-6.
  16. ;
  17. B_SEARCH  PROC
  18.       PUSH      DS             ;Save caller's DS register
  19. ;
  20. ;  To start, find out if AX lies beyond the boundaries of the list.
  21. ;
  22.       CMP        AX,ES:[DI+2]     ;Search value < or = first el.?
  23.       JA        CHK_LAST         ; No.  Go check last element
  24.       LEA        SI,ES:[DI+2]     ; Yes.  Fetch addr. of first el.
  25.       JE        EXIT_1ST         ;If value = 1st element, exit
  26.       STC                 ;If value < 1st element, set CF
  27. EXIT_1ST: POP       DS             ;and then exit
  28.           RET
  29. CHK_LAST: MOV        SI,ES:[DI]         ;Point to last element
  30.       SHL        SI,1
  31.       ADD        SI,DI
  32.       CMP        AX,ES:[SI]         ;Search value > or = last el.?
  33.       JB        SEARCH           ; No.  Go search list
  34.       JE        EXIT_LAST        ; Yes.  Exit if value = last el.
  35.       STC                 ;If value > last element, set CF
  36. EXIT_LAST: POP      DS               ;   and then exit
  37.           RET
  38. ;
  39. ;  Search for value within the list.
  40. ;
  41. SEARCH:  MOV        START_ADDR,DI    ;Save starting address in memory
  42.       MOV        SI,ES:[DI]         ;Fetch index
  43. EVEN_IDX: TEST        SI,1         ;Force index to an even value
  44.       JZ        ADD_IDX
  45.       INC        SI
  46. ADD_IDX:  ADD        DI,SI         ;Calculate next search address
  47. COMPARE:  CMP        AX,ES:[DI]         ;Search value found?
  48.       JE        ALL_DONE         ; If so, exit
  49.       JA        HIGHER         ; Otherwise, find correct half
  50. ;
  51. ;  These instructions are executed if the search value is lower
  52. ;  in the list.
  53. ;
  54.       CMP        SI,2         ;Index = 2?
  55.       JNE        IDX_OK
  56. NO_MATCH: STC                 ; If so, set CF
  57.       JE        ALL_DONE         ;  and exit
  58. IDX_OK:   SHR        SI,1         ; If not, divide index by 2
  59.       TEST        SI,1         ;Force index to an even value
  60.       JZ        SUB_IDX
  61.       INC        SI
  62. SUB_IDX:  SUB        DI,SI         ;Calculate next address
  63.       JMP        SHORT COMPARE    ;Go check this element
  64. ;
  65. ;  These instructions are executed if the search value is higher
  66. ;  in the list.
  67. ;
  68. HIGHER:   CMP        SI,2         ;Index = 2?
  69.       JE        NO_MATCH         ; If so, go set CF and exit
  70.              SHR        SI,1         ; If not, divide index by 2
  71.       JMP        SHORT EVEN_IDX   ;Go check next element
  72. ;
  73. ;  Following are exit instructions.
  74. ;
  75. ALL_DONE: MOV       SI,DI         ;Move compare address into SI
  76.             MOV        DI,START_ADDR    ;Restore starting address
  77.       POP        DS
  78.            RET                 ; and exit
  79. B_SEARCH  ENDP
  80. REPLACE   ENDP
  81. OUR_CODE  ENDS
  82.          END       REPLACE
  83.